import type { NamePath } from 'ant-design-vue/lib/form/interface'
import type { ColProps } from 'ant-design-vue/lib/grid/Col'
import type { HTMLAttributes, VNodeChild } from 'vue'

export interface FormItem {
  /**
   * Used with label, whether to display : after label text.
   * @default true
   * @type boolean
   */
  colon?: boolean

  /**
   * The extra prompt message. It is similar to help. Usage example: to display error message and prompt message at the same time.
   * @type any (string | slot)
   */
  extra?: string | VNodeChild | JSX.Element

  /**
   * Used with validateStatus, this option specifies the validation status icon. Recommended to be used only with Input.
   * @default false
   * @type boolean
   */
  hasFeedback?: boolean

  /**
   * The prompt message. If not provided, the prompt message will be generated by the validation rule.
   * @type any (string | slot)
   */
  help?: string | VNodeChild | JSX.Element

  /**
   * Label test
   * @type any (string | slot)
   */
  label?: string | VNodeChild | JSX.Element

  /**
   * The layout of label. You can set span offset to something like {span: 3, offset: 12} or sm: {span: 3, offset: 12} same as with <Col>
   * @type Col
   */
  labelCol?: ColProps & HTMLAttributes

  /**
   * Whether provided or not, it will be generated by the validation rule.
   * @default false
   * @type boolean
   */
  required?: boolean

  /**
   * The validation status. If not provided, it will be generated by validation rule. options: 'success' 'warning' 'error' 'validating'
   * @type string
   */
  validateStatus?: '' | 'success' | 'warning' | 'error' | 'validating'

  /**
   * The layout for input controls, same as labelCol
   * @type Col
   */
  wrapperCol?: ColProps
  /**
   * Set sub label htmlFor.
   */
  htmlFor?: string
  /**
   * text align of label
   */
  labelAlign?: 'left' | 'right'
  /**
   * a key of model. In the setting of validate and resetFields method, the attribute is required
   */
  name?: NamePath
  /**
   * validation rules of form
   */
  rules?: object | object[]
  /**
   * Whether to automatically associate form fields. In most cases, you can setting automatic association.
   * If the conditions for automatic association are not met, you can manually associate them. See the notes below.
   */
  autoLink?: boolean
  /**
   * Whether stop validate on first rule of error for this field.
   */
  validateFirst?: boolean
  /**
   * When to validate the value of children node
   */
  validateTrigger?: string | string[] | false
}
